home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UTIL / MEMORY / OLD / MEM208SRC / FSLib / s / swiv < prev   
Text File  |  1991-11-21  |  4KB  |  132 lines

  1. r0              RN      0
  2. r1              RN      1
  3. r2              RN      2
  4. r3              RN      3
  5. r4              RN      4
  6. r5              RN      5
  7. r6              RN      6
  8. r7              RN      7
  9. r8              RN      8
  10. r9              RN      9
  11. r10             RN      10
  12. r11             RN      11
  13. r12             RN      12
  14. sp              RN      13
  15. lr              RN      14
  16. pc              RN      15
  17.  
  18.  
  19.                 AREA    |C$$code|, CODE, READONLY
  20.  
  21.         EXPORT  |_swix|
  22.         EXPORT  |_swi|
  23. |_swi|
  24.  
  25. ; Construct a stack frame that looks something like this:
  26. ;       LDMIA   r12!, {r0..rn}      ; Or NOP if no input regs
  27. ;       ADD     Rb, R12, #Nout * 4  ; Or NOP if no parameter block
  28. ;       SWI     xxxxxx
  29. ;       MOV     R0, Rn              ; Use ADD because Rn is correct bitfield
  30. ;       B       SWIReturn
  31. ;       saved r4-r11,lr
  32. ;       saved r1
  33. ;       saved input values (r2...rn)
  34.  
  35.         STMFD   sp!, {r2-r3}            ; Save r1 and put 1st two variadic args on stack
  36.         STMDB   sp!, {r1, r4-r9, lr}
  37.         ADR     r6, SWIReturn-4
  38.         B       swix0
  39. |_swix|
  40.         ORR     r0, r0, #&20000
  41.         STMDB   sp!, {r2-r3}
  42.         STMDB   sp!, {r1, r4-r9, lr}
  43.         ADR     r6, SWIXReturn-4
  44. swix0
  45.         ORR     r3, r0, #&ef000000      ; Construct SWI instruction
  46.         MOV     r0, r1, LSL #22         ; Construct LDMIA R12!, {regs} instruction
  47.         MOVS    r0, r0, LSR #22         ; {regs} = {} (IE no input regs) we must not
  48.         ORRNE   r0, r0, #&e8000000      ; use an LDMIA R12!, {} instruction as this is an
  49.         ORRNE   r0, r0, #&00bc0000      ; invalid instruction, we use a suitable NOP instead.
  50.         MOV     r5, r1, LSR #16
  51.         AND     r5, r5, #&f
  52.         ORR     r5, r5, #&e1000000
  53.         ORR     r5, r5, #&a00000
  54.         ANDS    r2, r1, #&800
  55.         BLNE    BuildBlockInst
  56.         SUB     r6, r6, sp
  57.         MOV     r6, r6, LSR #2
  58.         BIC     r6, r6, #&ff000000
  59.         ADD     r6, r6, #&ea000000
  60.         STMDB   sp!, {r0,r2,r3,r5,r6}
  61.         ADD     r12, sp, #(5+8)*4       ; Point R12 at input regs on stack.
  62.         MOV     pc, sp                  ; Call routine on stack
  63. SWIReturn
  64.         STR     pc, [sp, #4*4]!
  65.         LDR     lr, [sp, #1*4]
  66.         MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
  67.         LDRCS   lr, [r12], #4           ; if R1 to be written.
  68.         STRCS   r0, [lr]
  69.         LDRMI   lr, [r12], #4
  70.         STRMI   r1, [lr]
  71.         LDR     lr, [sp, #1*4]
  72.         B       ReturnTail
  73. SWIXReturn
  74.         STR     pc, [sp, #4*4]!
  75.         LDR     lr, [sp, #1*4]
  76.         BVS     VSetReturn
  77.         MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
  78.         LDRCS   lr, [r12], #4           ; if R1 to be written.
  79.         STRCS   r0, [lr]
  80.         LDRMI   lr, [r12], #4
  81.         STRMI   r1, [lr]
  82.         LDR     lr, [sp, #1*4]
  83.         TST     lr, #&f0000
  84.         MOVEQ   r0, #0
  85. ReturnTail
  86.         MOVS    lr, lr, ASL #3          ; Shift 2 bits each time for the next 2 regs
  87.         LDRCS   r1, [r12], #4
  88.         STRCS   r2, [r1]
  89.         LDRMI   r1, [r12], #4
  90.         STRMI   r3, [r1]
  91.         AND     lr, lr, #&ff000000
  92.         MOVS    lr, lr, ASL #2
  93.         LDRCS   r1, [r12], #4
  94.         STRCS   r4, [r1]
  95.         BEQ     VSetReturn              ; Typically saves 16S - (3S + 1N)
  96.         LDRMI   r1, [r12], #4
  97.         STRMI   r5, [r1]
  98.         MOVS    lr, lr, ASL #2
  99.         LDRCS   r1, [r12], #4
  100.         STRCS   r6, [r1]
  101.         LDRMI   r1, [r12], #4
  102.         STRMI   r7, [r1]
  103.         MOVS    lr, lr, ASL #2
  104.         LDRCS   r1, [r12], #4
  105.         STRCS   r8, [r1]
  106.         LDRMI   r1, [r12], #4
  107.         STRMI   r9, [r1]
  108.         MOVS    lr, lr, ASL #2
  109.         LDRCS   r9, [sp]
  110.         LDRCS   r1, [r12], #4
  111.         STRCS   r9, [r1]
  112. VSetReturn
  113.         ADD     sp, sp, #2*4
  114.         LDMIA   sp!, {r4-r9,lr}
  115.         ADD     sp, sp, #2 * 4
  116.         MOVS    pc, lr
  117.  
  118. BuildBlockInst
  119.         MOV     r4, #6
  120.         AND     r2, r1, #&f000
  121.         ORR     r2, r2, #&e2000000
  122.         ORR     r2, r2, #&008c0000
  123. BuildBlockInst1
  124.         MOVS    r1, r1, ASL #2
  125.         ADDCS   r2, r2, #4
  126.         ADDMI   r2, r2, #4
  127.         SUBS    r4, r4, #1
  128.         BNE     BuildBlockInst1
  129.         MOVS    pc, lr
  130.  
  131.         END
  132.